package servlet;

import model.User;
import service.UserService;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.MultipartConfig;
import java.io.IOException;
import java.io.File;
import java.util.Date;

@WebServlet(name = "user_register", urlPatterns = "/user_register")
@MultipartConfig(
        fileSizeThreshold = 1024 * 1024, // 1 MB，超过的文件写入磁盘，不写入内存
        maxFileSize = 1024 * 1024 * 10,  // 10 MB 单个文件最大
        maxRequestSize = 1024 * 1024 * 15 // 15 MB 整个表单请求最大
)

public class UserRegisterServlet extends HttpServlet{
    private UserService userService=new UserService();

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
        try {
            request.setCharacterEncoding("UTF-8");
            //  获取前端表单数据
            String nickname = request.getParameter("nickname");
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String phone_number = request.getParameter("phone_number");
            // 处理头像上传
            // 默认头像路径，若用户未上传新头像则使用此路径
            String avatarPath = "/picture/avatar.png";
            //从表单中获取avatar
            Part avatarPart = request.getPart("avatar");
            if (avatarPart != null && avatarPart.getSize() > 0) {
                // 生成唯一文件名（时间戳+原文件扩展名）
                String fileName = new Date().getTime() + getFileExtension(avatarPart);
                // 获取服务器上/picture目录的实际路径
                String uploadPath = getServletContext().getRealPath("/picture");
                File uploadDir = new File(uploadPath);
                if (!uploadDir.exists()) {
                    // 若不存在则创建目录（包括父目录）
                    if (!uploadDir.mkdirs()) {
                        throw new IOException("文件创建失败: " + uploadPath);
                    }
                }
                // 将上传文件写入指定路径
                avatarPart.write(uploadPath + File.separator + fileName);
                // 更新头像路径为新上传文件的路径
                avatarPath = "/picture/" + fileName;
            }

            // 创建用户对象并设置其属性
            User user = new User();
            user.setNickname(nickname);
            user.setUsername(username);
            user.setPassword(password);
            user.setPhone_number(phone_number);
            user.setAvatar(avatarPath);
            user.setCreate_time(new Date());
            user.setAdmin(false);
            // 注册新用户
            boolean isSuccess = userService.register(user);
            String message = userService.getRegisterResultMessage(isSuccess,username,phone_number);
            request.setAttribute("msg",message);

            //注册成功后重定向到用户登录界面
            if(isSuccess) {
                response.sendRedirect(request.getContextPath() + "/user_login.jsp");
            }
            //注册失败把请求转发回注册页面，并且提示失败信息
            else {
                request.getRequestDispatcher("/user_register.jsp").forward(request,response);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msg","注册失败：" + e.getMessage());
            request.getRequestDispatcher("/user_register.jsp").forward(request,response);
        }
    }

    //文件扩展名的提取
    private String getFileExtension(Part part) {
        // 获取HTTP头中的字段，并用；分割
        String contentDisp = part.getHeader("content-disposition");
        String[] tokens = contentDisp.split(";");

        // 遍历每个键值对
        for (String token : tokens) {
            // 查找文件名
            if (token.trim().startsWith("filename")) {
                // 提取文件名，跳过=，“”，保留中间部分，avatar.jpg
                String fileName = token.substring(token.indexOf("=") + 2, token.length() - 1);

                // 查找文件名中最后一个点.的位置
                int dotIndex = fileName.lastIndexOf(".");

                // 如果存在点且不在首位，则返回扩展名，否则返回空字符串
                return dotIndex > 0 ? fileName.substring(dotIndex) : "";
            }
        }
        return "";
    }
}
